package it.blueocean.acanto.web.pages.secure.prodotto;

import it.blueocean.acanto.model.Prodotto;
import it.blueocean.acanto.model.constants.StatoProdotto;
import it.blueocean.acanto.model.constants.TipoIva;
import it.blueocean.acanto.model.constants.TipoUnitaDiMisura;
import it.blueocean.acanto.service.ProdottoService;
import it.blueocean.acanto.web.platform.components.feedback.SelectModalWindow;
import it.blueocean.acanto.web.platform.components.feedback.ValidationStyleBehavior;

import java.math.BigDecimal;
import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.value.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DettaglioProdotto extends Panel
{

	private static final long serialVersionUID = 1287891178035762591L;
	
	private static final Logger log = LoggerFactory.getLogger(DettaglioProdotto.class);

	private Label name;

	private ModalWindow errorFeedbackModalWindow;

	private ModalWindow successFeedbackModalWindow;
	
	@SpringBean
	private ProdottoService prodottoService;

	public DettaglioProdotto(String id)
	{
		super(id);

		name = new Label("name", "nuovo prodotto");
		name.setOutputMarkupId(true);
		add(name);
		
		AcantoStandardForm form = new AcantoStandardForm("acantoStandardForm");
		form.setOutputMarkupId(true);
		add(form);
	}
	
	public final class AcantoStandardForm extends StatelessForm<ValueMap>
	{
		private static final long serialVersionUID = 152935048215475502L;

		@SuppressWarnings("unchecked")
		public AcantoStandardForm(String id)
		{
			super(id, new CompoundPropertyModel<ValueMap>(new ValueMap()));

			errorFeedbackModalWindow = new SelectModalWindow("errorModalWindow", 
					"Errore di validazione", 
					300,
					155);
			add(errorFeedbackModalWindow);	
			
			successFeedbackModalWindow = new SelectModalWindow("successModalWindow", 
					"Azione eseguita", 
					300,
					155);
			add(successFeedbackModalWindow);

			TextField<String> codiceProdotto = new TextField<String>("codiceProdotto");
			codiceProdotto.setRequired(true);
			codiceProdotto.setOutputMarkupId(true);
			codiceProdotto.add(new ValidationStyleBehavior());
			add(codiceProdotto);

			TextField<Double> prezzoUnitario = new TextField<Double>("prezzoUnitario");
			prezzoUnitario.setRequired(true);
			prezzoUnitario.setOutputMarkupId(true);
			// prezzoUnitario.add(NumberValidator.RangeValidator.range(0,
			// 99999999));
			prezzoUnitario.add(new ValidationStyleBehavior());
			add(prezzoUnitario);

			TextField<Double> scontoPercentuale = new TextField<Double>("scontoPercentuale");
			scontoPercentuale.setRequired(true);
			scontoPercentuale.setOutputMarkupId(true);
			// scontoPercentuale.add(NumberValidator.RangeValidator.range(0,
			// 99999999));
			scontoPercentuale.add(new ValidationStyleBehavior());
			add(scontoPercentuale);

			DropDownChoice aliquotaIvaComboBox = new DropDownChoice("aliquotaIva",
					new LoadableDetachableModel<List<String>>()
					{
						private static final long serialVersionUID = -8189203261004116433L;

						@Override
						protected List<String> load()
						{
							return TipoIva.getListStringTipiIvaValues();
						}

					});
			aliquotaIvaComboBox.setRequired(true);
			aliquotaIvaComboBox.setOutputMarkupId(true);
			aliquotaIvaComboBox.add(new ValidationStyleBehavior());
			add(aliquotaIvaComboBox);

			DropDownChoice unitaMisuraComboBox = new DropDownChoice("unitaMisura",
					new LoadableDetachableModel<List<String>>()
					{

						private static final long serialVersionUID = 3712289549796409053L;

						@Override
						protected List<String> load()
						{
							return TipoUnitaDiMisura.getListStringTipiUnitadiMisuraValues();
						}
					});
			unitaMisuraComboBox.setRequired(true);
			unitaMisuraComboBox.add(new ValidationStyleBehavior());
			unitaMisuraComboBox.setOutputMarkupId(true);
			add(unitaMisuraComboBox);

			TextArea<String> descrizione = new TextArea<String>("descrizione");
			descrizione.setRequired(true);
			descrizione.setOutputMarkupId(true);
			descrizione.add(new ValidationStyleBehavior());
			add(descrizione);

			TextField<String> note = new TextField<String>("note");
			note.setOutputMarkupId(true);
			add(note);

			DropDownChoice statusComboBox = new DropDownChoice("status", new LoadableDetachableModel<List<String>>()
			{
				private static final long serialVersionUID = 2933800918053929315L;

				@Override
				protected List<String> load()
				{
					return StatoProdotto.getListStringStatiProdottoValues();
				}
			});
			statusComboBox.setRequired(true);
			statusComboBox.add(new ValidationStyleBehavior());
			statusComboBox.setOutputMarkupId(true);
			add(statusComboBox);

			add(new AjaxFallbackButton("submitButton", this)
			{
				private static final long serialVersionUID = 159710398094370478L;

				@Override
				protected void onSubmit(AjaxRequestTarget target, Form<?> form)
				{
					ValueMap values = (ValueMap) form.getDefaultModelObject();

					String codiceProdotto = values.getString("codiceProdotto");
					Double prezzoUnitario = values.getDouble("prezzoUnitario");
					Double scontoPercentuale = values.getDouble("scontoPercentuale");
					String aliquotaIva = values.getString("aliquotaIva");
					String unitaMisura = values.getString("unitaMisura");
					String descrizione = values.getString("descrizione");
					String note = values.getString("note");
					String status = values.getString("status");

					log.debug("saving new Prodotto");

					Prodotto prodotto = new Prodotto();
					prodotto.setAliquotaIva(TipoIva.getFromValue(aliquotaIva));
					prodotto.setCodiceProdotto(codiceProdotto);
					prodotto.setDescrizione(descrizione);
					prodotto.setNote(note);
					prodotto.setPrezzoUnitario(new BigDecimal(prezzoUnitario));
					prodotto.setScontoPercentuale(new Double(scontoPercentuale));
					prodotto.setStatus(StatoProdotto.getFromValue(status));
					prodotto.setUnitaMisura(TipoUnitaDiMisura.getFromValue(unitaMisura));

					prodottoService.store(prodotto);
					
					successFeedbackModalWindow.show(target);
				}

				@Override
				protected void onError(final AjaxRequestTarget target, Form<?> form)
				{
					form.visitFormComponents(new IVisitor()
					{
						public Object formComponent(IFormVisitorParticipant formVisitor)
						{
							if(formVisitor instanceof FormComponent)
							{
								FormComponent<?> formComponent = (FormComponent<?>) formVisitor;
								target.addComponent(formComponent);
							}
							return formVisitor;
						}
					});

					errorFeedbackModalWindow.show(target);
				}
			});
		}
	}

}
